package org.example.journal;

import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 使用Logger来打一个日志，slf4j是其他日志框架的门面，他没有实现日志的打印，而是通过对其他许多日志的框架提供的api进行跟高层次的封装
 * 来实现的日志的打印，也可以直接使用对饮的人日志框架来实现日志的打印，但是这样就会有个很大的问题，如果有多个日志框架共存的话，那么就需要
 * 维护多个配置文件，而且如果要更改日志框架的话就需要修改应用程序的代码，那么就还会出现一个代码冲突的问题
 * 所以使用slf4j这个门面类来对很多的日志框架进行封装，应用程序只需要直接使用这个门面类就好
 * 2025-02-27T15:10:54.140+08:00  INFO 25148 --- [journal] [nio-8080-exec-8] org.example.journal.log                  : mark
 * 日志时间                级别  进程端口号    应用名称        线程                logger名（通常是源代码的类名）          日志内容
 * 如果没有配置spring.application.name=journal这个的话应用名称不会显示在应用名称中
 * 日志级别 级别由高到低
 * FATAL：致命信息，需要马上处理
 * ERROR：错误信息，级别较高的错误信息，但仍不会影响程序的运行
 * WARN：警告信息，不影响运行的信息，但需要注意问题，可能会出现某些问题
 * INFO：普通信息，用于记录程序正常运行的信息，启动信息，交换信息等
 * DEBUG：调试信息，在调试的时候需要的关键信息打印
 * TRACE：追踪信息，比debug更细粒度的信息，没特殊信息一般使用debug
 * 日志的配置信息
 * 设置日志的显示级别
 * logging.level.root=...
 * 日志的持久化
 * 配置日志的储存路径：logging.file.name=log.log 这个路径表示的是在主项目下的journal文件夹下的log.log文件
 * 分割日志
 * 设置的是日志的的最大容量，超过就分割：logging.logback.rollingpolicy.max-file-size=1KB
 * 设置日志的分割格式：logging.logback.rollingpolicy.file-name-pattern=${LOG_FILE}.%d{yyyy-MM-dd}.%i.xx
 * 分割的文件格式为                                                     原日志名      分割时的日期    自动添加编号  添加后缀
 * 配置的日志格式
 * 分为控制台日志和日志文件日志俩种格式，他们的区别是 控制台日志是在运行程序的时候能看到的，也就是run中的在进程结束之后也就消失了
 * 而日志文件中的会一直保存下来
 * 在课件中有，要用时再看，感觉默认的挺好的
 * 更简单的日志输入 lombok
 * 注解 @slf4j 自动生成一个叫做log的logger类并且名字就是注解修饰的这个类
 */
@RequestMapping("log")
@Slf4j
@RestController
public class log {
    //这里传参设置的logger名
    private Logger logger = LoggerFactory.getLogger(log.class);

    @RequestMapping("/mark")
    public String mark() {
        logger.info("mark");
        return "mark";
    }

    //设置不同级别的日志 不能设置fatal级别的，因为这种的影响太大了，会同过能直接的方式通知，打电话发邮件啥的
    @RequestMapping("/all")
    public String all() {
        logger.error("error");
        logger.warn("warn");
        logger.info("info");
        logger.debug("debug");
        logger.trace("trace");
        log.debug("debug");
        log.info("info");
        return "success";
    }
}

